﻿namespace GoFun.Tests

open NUnit.Framework
open GoFun.Lib

type IsLastSet = bool
type SingleParserResult = PositionStatus*IsLastSet
type ParserReslut = { Brett : Brett; Gesetzt : (Position*PositionStatus) option }

[<AutoOpen>]
module TestParser =

    let private parsePosition (symbol : char) : SingleParserResult =
        match symbol with
        | '_' -> (PositionStatus.Empty, false)
        | 'x' -> (PositionStatus.Empty, true)
        | 'b' -> (PositionStatus.Black, false)        
        | 'B' -> (PositionStatus.Black, true)        
        | 'w' -> (PositionStatus.White, false)        
        | 'W' -> (PositionStatus.White, true)        
        | _   -> failwith (sprintf "unbekannter Positions-Typ %A" symbol)

    let private parseZeile (zeile : char list) : (SingleParserResult array) =
        zeile |> List.map parsePosition |> List.toArray

    let parseBrett (brett : char list list) : ParserReslut =
        let zeilen = brett |> List.map parseZeile |> List.toArray
        let dim = zeilen.[0].Length
        let rec findGesetzt (zeile, spalte) : (Position*PositionStatus) option =
            if zeile >= dim || spalte >= dim then None else
            match zeilen.[zeile].[spalte] with
            | (status, true) -> 
                Some ((zeile, spalte), status)
            | _              -> 
                let nächstePos =
                    if spalte + 1 >= dim then (zeile+1,0)
                    else (zeile, spalte+1)
                findGesetzt nächstePos
        let getAt zeile spalte = zeilen.[zeile].[spalte] |> fst
        { Brett = Array2D.init dim dim getAt; Gesetzt = findGesetzt(0,0) }

